package medOffice;

import java.util.Calendar;
import java.util.GregorianCalendar;

import medOffice.Enuns.EstadoDaConsulta;
import medOffice.Enuns.Sexo;
import medOffice.Enuns.TipoDeConsulta;
import medOffice.Enuns.Urgencia;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * Classe de testes da classe Consulta.
 * @author tiago leite
 *
 */

public class ConsultaTestes {
	
	private Calendar dataNascimentoP1, dataNascimentoP2, dataNascimentoM1, 
	dataNascimentoM2,agora, dataFutura,dataPassada ;
	
	private Paciente paciente, pacienteNovo;
	private Medico medico; 	
	private Consulta consulta, consultaNova, consulta2;
	private PlanoDeSaude plano1, plano2;
	
	@Before
	public void setUp() throws Exception {
		//ano, mes, dia, hora, minuto
		plano1 = new PlanoDeSaude("Unimed", "(83) 3333-1122", 0, 0, 44556693);
		plano2 = new PlanoDeSaude("Plus saude", "(83) 3355-4488", 50, 50, 2213654);
		
		agora = new GregorianCalendar();
		dataFutura = new GregorianCalendar(2009, 11, 15, 8, 30);
		dataPassada= new GregorianCalendar(2008, 11, 15, 8, 30);
		
		dataNascimentoP1 = new GregorianCalendar(1987, 11, 27, 15, 13);
		dataNascimentoP2 = new GregorianCalendar(1990, 0, 10, 02, 56);
		dataNascimentoM1 = new GregorianCalendar(1959, 11, 27, 15, 13);
		dataNascimentoM2 = new GregorianCalendar(1960, 06, 6, 20, 43);
		
		
		paciente = new Paciente("Tiago Leite", "123456344-23", "rua do rio 15", "(83) 3122-4552",
				dataNascimentoP1, "chalanger@gmail.com", Sexo.M, plano1);
		
		pacienteNovo = new Paciente("Antonio Jesus", "563521478-56", "rua do brejo 18",
				"(83) 3122-9863", dataNascimentoP2, "antonio@gmail.com", Sexo.M, plano2);
		
		medico = new Medico("Dr Henrique", "271592632-36");
		medico.setEndereco("rua miguel paiva 42");
		medico.setTelefone("(83) 9633-3010");
		
		
		
		consulta = new Consulta(paciente, agora, Urgencia.N);
		
		consultaNova = new Consulta(pacienteNovo, dataFutura, Urgencia.S);
	}
	
	@Test
	public void testConstrutor() {
		Assert.assertNotNull("Objeto nao deveria ser nulo.", consulta);
		Assert.assertEquals("Construtor(paciente) com problema.", paciente, consulta.getPaciente());
		Assert.assertEquals("Construtor(agora) com problema.", agora, consulta.getData());
		Assert.assertEquals("Construtor(urgencia) com problema.", Urgencia.N, consulta.getUrgencia());
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionPacienteNull() throws Exception {
		consulta2 = new Consulta(null, agora, Urgencia.N);
	}
	
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionDataNull() throws Exception {
		consulta2 = new Consulta(paciente, null, Urgencia.S);
	}
	
	@Test
	public void testSetPaciente() {
		consulta.setPaciente(null);
		Assert.assertEquals("Paciente errado 1.", "Tiago Leite", consulta.getPaciente().getNome());
		consulta.setPaciente(pacienteNovo);
		Assert.assertEquals("Paciente errado 2.", "Antonio Jesus", consulta.getPaciente().getNome());
	}
	
	
	@Test
	public void testSetData() {
		consulta.setData(null);
		Assert.assertEquals("Data errada 1.", agora, consulta.getData());
		consulta.setData(dataFutura);
		Assert.assertEquals("Data errada 2.", dataFutura, consulta.getData());
		consulta.setData(dataPassada);
		Assert.assertEquals("Data errada 3.", dataFutura, consulta.getData());
				
	}
	
	@Test
	public void testSetTipoConsulta() {
		consulta.setTipoDeConsulta(null);
		Assert.assertEquals("Tipo errado 1.", TipoDeConsulta.CONSULTA, consulta.getTipoDeConsulta());
		consulta.setTipoDeConsulta(TipoDeConsulta.RETORNO);
		Assert.assertEquals("Tipo errado 2.", TipoDeConsulta.RETORNO, consulta.getTipoDeConsulta());
		consulta.setTipoDeConsulta(null);
		Assert.assertEquals("Tipo errado 3.", TipoDeConsulta.RETORNO, consulta.getTipoDeConsulta());
	}
	
	@Test
	public void testSetEstadoConsulta() {
		Assert.assertNotSame("Estado errado 1.", EstadoDaConsulta.ATENDIDO, consulta.getEstadoDaConsulta());
		consulta.setEstadoDaConsulta(null);
		Assert.assertEquals("Estado errado 2.", EstadoDaConsulta.NAO_ATENDIDO, consulta.getEstadoDaConsulta());
		consulta.setEstadoDaConsulta(EstadoDaConsulta.EM_ESPERA);
		Assert.assertEquals("Estado errado 3.", EstadoDaConsulta.EM_ESPERA, consulta.getEstadoDaConsulta());
		consulta.setEstadoDaConsulta(EstadoDaConsulta.ATENDIDO);
		Assert.assertEquals("Estado errado 4.", EstadoDaConsulta.ATENDIDO, consulta.getEstadoDaConsulta());
	}
	
	@Test
	public void testSetUrgencia() {
		Assert.assertEquals("Urgencia errada!", consulta.getUrgencia(), Urgencia.N);
		Assert.assertEquals("Urgencia errada!", consultaNova.getUrgencia(), Urgencia.S);
		consulta.setUrgencia(Urgencia.S);
		Assert.assertEquals("Urgencia errada!", consulta.getUrgencia(), Urgencia.S);
		consultaNova.setUrgencia(Urgencia.N);
		Assert.assertEquals("Urgencia errada!", consultaNova.getUrgencia(), Urgencia.N);
	}
}